#include "ABMPersona.h"
#include "ui_ABMPersona.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *persona_model;

// Definición de acceso directo para borrar un registro mediante la tecla "Supr".
QShortcut* shortcutBaja4;

/*
 * Constructor de la la clase Persona.
 */
ABMPersona::ABMPersona(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ABMPersonas)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);

    persona_model = new QSqlRelationalTableModel(this,enjoylifedb);
    persona_model->setTable("persona");
    persona_model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);

    on_add_persona = false;
    on_edit_persona = false;
    row_edited = -1;

    ui->label_persona->setEnabled(false);
    ui->persona->setEnabled(false);
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);

    SelectPersonas();

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), this);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(on_agregarBtn_clicked()));
}

/*
 * Destructor de la la clase Persona.
 */
ABMPersona::~ABMPersona()
{
    delete ui;
}

/*
 *
 */
void ABMPersona::GetPersonas(QString s_persona)
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select persona from persona where persona = ";
    stm.append("\'");
    stm.append(s_persona);
    stm.append("\'");

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query->lastError().text());
        return;
    }

    while (query->next()) {
        ui->persona->setText(s_persona);
    }

    //    filterPersona = "persona = '" + s_persona + "'";
    //    SelectPersonas();
}

/*
 * Se realiza un select sobre la tabla persona.
 */
void ABMPersona::SelectPersonas()
{
    persona_model->setTable("persona");
    QString filter = "persona not in (select razon_social from cliente)";
    persona_model->setFilter(filter);
    enjoylifedb.transaction();
    if (!persona_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewPersonas();
}

void ABMPersona::CorrectViewPersonas()
{
    persona_model->setHeaderData(0,Qt::Horizontal,"Nro. Persona");
    persona_model->setHeaderData(1,Qt::Horizontal,"Persona");

    ui->personas_view->setModel(persona_model);
    ui->personas_view->setAlternatingRowColors(true);
    ui->personas_view->setGridStyle(Qt::SolidLine);
    ui->personas_view->sortByColumn(3,Qt::SortOrder());
    ui->personas_view->setSortingEnabled(true);
    ui->personas_view->horizontalHeader()->setStretchLastSection(true);
    ui->personas_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->personas_view->setColumnWidth(1, 400);
}

/*
 * Acción del botón agregar.
 */
void ABMPersona::on_agregarBtn_clicked()
{
    if (!ui->persona->text().isEmpty()) {
        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Alerta!"),
                                       "Actualmente está editando una persona "
                                       "quiere cancelar la operación e ingresar uno nuevo?",
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            ui->persona->clear();
            ui->label_persona->setEnabled(true);
            ui->persona->setEnabled(true);
            ui->persona->setFocus();
            on_add_persona = true;
            ui->editarBtn->setEnabled(false);
            ui->eliminarBtn->setEnabled(false);
            ui->guardarBtn->setEnabled(true);
            return;
        }
    }
    else {
        ui->persona->clear();
        ui->label_persona->setEnabled(true);
        ui->persona->setEnabled(true);
        ui->persona->setFocus();
        on_add_persona = true;
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(true);
    }
}

/*
 * Acción del botón guardar.
 */
void ABMPersona::on_guardarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar persona"),
                                   "¿Está seguro que quiere "
                                   "guardar la persona " + ui->persona->text() + "?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        // Se seleccionó la opción de agregar un nuevo persona.
        if (on_add_persona) {

            if (ui->persona->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar persona",
                                      "Advertencia! Debe ingresar un valor para persona");
                return;
            }

            // Se decide guardar el persona
            QSqlRecord record;

            // Se agrega la personal
            QSqlField pField(QStringLiteral("persona"), QVariant::String);
            pField.setValue(ui->persona->text());
            record.append(pField);

            enjoylifedb.transaction();
            if (!(persona_model->insertRecord(-1, record))) {
                QString error = persona_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar la persona, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            SelectPersonas();
        }

        // El usuario hizo click sobre el boton editar.
        if (on_edit_persona) {
            QString filter = "id_persona = '" + idPersona + "'";
            persona_model->setFilter(filter);
            enjoylifedb.transaction();
            if (!(persona_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (persona_model->rowCount() == 1) {
                QSqlRecord record = persona_model->record(0);

                if (ui->persona->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar persona",
                                          "Advertencia! Debe ingresar un valor para el persona");
                    return;
                }

                record.setValue("persona", ui->persona->text());

                persona_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!persona_model->submitAll()) {
                    QString error = persona_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }

            SelectPersonas();
        }
        row_edited = -1;
        on_add_persona = false;
        on_edit_persona = false;
        ui->agregarBtn->setEnabled(true);
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(false);
        ui->persona->clear();
        ui->label_persona->setEnabled(false);
        ui->persona->setEnabled(false);
    }
    else
        return;
}

/*
 * Acción del botón eliminar.
 */
void ABMPersona::on_eliminarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Eleminar persona"),
                                   "¿Está seguro que quiere "
                                   "eliminar la persona '" + ui->persona->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        enjoylifedb.transaction();
        if (!persona_model->removeRow(ui->personas_view->currentIndex().row())) {
            QMessageBox::critical(this,"Error!", "No se pudo eliminar la persona, vuelva a intentarlo.");
            enjoylifedb.rollback();
            return;
        }
        QMessageBox::information(this,"Exito!", "La persona fue eliminada correctamente.",
                                 QMessageBox::Ok);

        persona_model->submitAll();
        enjoylifedb.commit();
    }
    row_edited = -1;
    on_add_persona = false;
    on_edit_persona = false;
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);
    ui->persona->clear();
    ui->label_persona->setEnabled(false);
    ui->persona->setEnabled(false);
}

/*
 * Acción al hacer click sobre una persona.
 */
void ABMPersona::on_personas_view_clicked(const QModelIndex &index)
{
    if (index.row() != -1) {
//        ui->agregarBtn->setEnabled(false);
        ui->editarBtn->setEnabled(true);
        ui->eliminarBtn->setEnabled(true);
        ui->guardarBtn->setEnabled(true);
        idPersona = persona_model->index(index.row(),0).data().toString();
        ui->persona->setText(persona_model->index(index.row(),1).data().toString());
        ui->label_persona->setEnabled(false);
        ui->persona->setEnabled(false);

        // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
        shortcutBaja4 = new QShortcut(QKeySequence(QKeySequence::Delete), ui->personas_view);
        connect(shortcutBaja4, SIGNAL(activated()), this, SLOT(on_eliminarBtn_clicked()));
        // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
        QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), ui->personas_view);
        connect(shortcutModif, SIGNAL(activated()), this, SLOT(on_editarBtn_clicked()));
    }
}

/*
 * Acción del botón editar.
 */
void ABMPersona::on_editarBtn_clicked()
{
    ui->label_persona->setEnabled(true);
    ui->persona->setEnabled(true);
    ui->guardarBtn->setEnabled(true);
    ui->persona->setFocus();
    on_edit_persona = true;
    row_edited = ui->personas_view->currentIndex().row();
}

/*
 * Acción del botón cerrar.
 */
void ABMPersona::on_cerrarBtn_clicked()
{
    close();
}
